iT邦幫忙

2023 iThome 鐵人賽

DAY 30
1
Software Development

Zero to Ruby on Rails系列 第 30

Day 30 - TDD 測試驅動開發

  • 分享至 

  • xImage
  •  

終於來到鐵人賽的最後一天,今天來講講什麼是TDD吧!寫測試!我們這裡提的「測試」,指的是 TDD(Test-Driven Development),中文翻譯做「測試驅動開發」。很多人會把重點放在 Test 上,但事實上 TDD 是一種 Development(開發)的方法,並不是一種「測試方法」!

什麼是測試驅動開發(TDD)?

測試驅動開發(TDD)是一種軟體開發方法,其核心思想是在實現功能代碼之前,首先編寫測試代碼,簡單來說寫的不是測試,是規格!TDD 遵循以下基本流程:

編寫測試:首先,開發人員寫測試用例,這些測試用例描述了代碼應該具備的功能或行為。

運行測試:運行測試,確保它們全部失敗。這是因為代碼尚未實現所需的功能。

實現功能:開發人員現在開始實現代碼以使測試通過。

重複:重複步驟 1 到 3,直到所有測試通過並且功能完全實現。

重構:在確保所有測試通過後,可以進行代碼重構以改進代碼的質量和性能。

什麼是 RSpec?

介紹了 TDD 那也講講常見的測試框架 RSpec 它的目標是讓測試代碼更容易閱讀和理解,RSpec 的語法旨在將測試用例讀起來像是自然語言,這使得開發人員和非開發人員更容易理解測試的目的和期望行為,RSpec 主要包含以下幾個核心:

Describe Blocks:

RSpec 使用 describe 來組織測試,它通常用於描述被測試的類、模組或功能:

describe Article do
  # 測試碼將在這裡
end

Context Blocks:

上下文用於建立測試的上下文,通常用來設置測試的前提條件:

describe Article do
  context "when a new article is created" do
    let(:article) { Article.new }
    # 測試碼將在這裡
  end
end

Examples:

例子是實際的測試用例,通常由 it 關鍵字引入。它們描述了一個具體的行為並包括斷言(expectations),用於驗證該行為的正確性

it "is not valid without a title" do
  article.title = nil
  expect(article).to_not be_valid
end

Expectations:

RSpec 提供了一組斷言方法,如 expect,用於確保測試的期望結果。你可以使用 expect 將一個實際值(例如一個變數或表達式的結果)與一個期望值進行比較,以確保它們相等或滿足某種條件

接下來稍微實際操作一下吧~

TDD 在 Ruby on Rails 中的應用

步驟 1:創建一個新的 Rails 應用

$ rails new BlogApp

步驟 2:加入 RSpec 到 Rails 中

# Gemfile

group :development, :test do
  gem 'rspec-rails'
end

執行安裝指令

$ bundle install

接下來,初始化 RSpec

$ rails generate rspec:install

步驟 3:建一個 Model

建一個 Article 模型,具有標題(title)和內容(content):

rails generate model Article title:string content:text

步驟 4:編寫 Model 測試

spec/models 目錄下,建一個新的測試文件 article_spec.rb,並加上以下內容確保 Article 模型的驗證工作正常

# spec/models/article_spec.rb

require 'rails_helper'

RSpec.describe Article, type: :model do
  it "is valid with a title and content" do
    article = Article.new(
      title: "Sample Article",
      content: "This is the content of the article."
    )
    expect(article).to be_valid
  end

  it "is not valid without a title" do
    article = Article.new(content: "This is the content of the article.")
    expect(article).to_not be_valid
  end

  it "is not valid without content" do
    article = Article.new(title: "Sample Article")
    expect(article).to_not be_valid
  end
end

步驟 5:運行 Model 測試

Article 模型的測試指令

$ rspec spec/models/article_spec.rb

如果所有測試通過,應該會看到一個成功的結果

步驟 6:實現 Model 功能

加入驗證確保標題和內容不為空

# app/models/article.rb

class Article < ApplicationRecord
  validates :title, presence: true
  validates :content, presence: true
end

步驟 7:再次運行 Model 測試

再跑一次 Article 模型的測試,應該會看到所有測試通過!

$ rspec spec/models/article_spec.rb

參考資料

為你自己學 Ruby on Rails

RSpec 自動測試介紹

結論

至於 TDD 要如何熟悉呢? 一個字 practice就是練,常常練、努力的練!

很開心鐵人賽在這邊告一個段落了,距離我成為四項鐵人又近了一點,完成了第一項也就是iT鐵人賽,接著除了增進自己工程師的技能樹之外,偶爾跑跑步、游一下泳和騎騎自行車來繼續鍛鍊體能和工程師技能,成為真正的四項鐵人囉!

預告

先來許願期許自己明年的目標:

1.明年可以完成泳渡日月潭

2.明年的鐵人賽可以寫個跟資料庫相關的深入探討或是使用心得教學之類的文章

我們明年見!


上一篇
Day 29 - NoSQL 非關聯式資料庫
系列文
Zero to Ruby on Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言